Option Explicit

Implements IDFDescriptor

'################################################################
' Field
'################################################################
' 当前描述器所在对象的【说明信息】
Private fieldComment As String

' 当前描述器所在对象在写入 sheet 后使用的【颜色信息】
' 需要使用 RGB 来设置
Private fieldColor As Long

' 当前描述器所在对象的【标签】集合
' Set<String>
Private fieldTags As ISet

' 当前描述器所在对象的【备注对象】集合
' 使用时应该注意使用统一类型的备注对象
' Set<Object>
Private fieldMemos As ISet

'################################################################
' Constructor
'################################################################
Private Sub Class_Initialize()
End Sub

Private Sub Class_Terminate()
End Sub

'################################################################
' Init
'################################################################
' @param commentVal 说明信息
' @param colorVal 颜色信息
' @param tagsVal 标签集合
' @param memosVal 备注对象集合
Public Sub InitForClone( _
    ByRef commentVal As String, _
    ByRef colorVal As Long, _
    ByRef tagsVal As ISet, _
    ByRef memosVal As ISet)

    fieldComment = commentVal
    fieldColor = colorVal
    Set fieldTags = tagsVal
    Set fieldMemos = memosVal
End Sub

'################################################################
' Property
'################################################################
' 返回描述器所在对象的【说明信息】
Public Property Get IDFDescriptor_Comment() As String
    IDFDescriptor_Comment = fieldComment
End Property

' 设置描述器所在对象的【说明信息】
Public Property Let IDFDescriptor_Comment(ByRef val As String)
    fieldComment = val
End Property

' 返回描述器所在对象在写入 sheet 后使用的【颜色信息】
Public Property Get IDFDescriptor_Color() As Long
    IDFDescriptor_Color = fieldColor
End Property

' 设置描述器所在对象在写入 sheet 后使用的【颜色信息】
Public Property Let IDFDescriptor_Color(ByRef val As Long)
    fieldColor = val
End Property

' 返回描述器所在对象的【标签】集合
' 如果没有设置过任何标签，应该返回 Nothing
Public Property Get IDFDescriptor_Tags() As ISet
    Set IDFDescriptor_Tags = fieldTags
End Property

' 当前描述器所在对象的【备注对象】集合
' 如果没有设置过任何备注，应该返回 Nothing
Public Property Get IDFDescriptor_Memos() As ISet
    Set IDFDescriptor_Memos = fieldMemos
End Property

'################################################################
' Function
'################################################################
' 以当前描述器为原型，克隆一个相同的新对象
' @return IDFDescriptor 属于指定容器的描述器
Public Function IDFDescriptor_clone() As IDFDescriptor
    Dim result As DFDescriptorInner
    Set result = New DFDescriptorInner

    ' 克隆标签
    Dim newTags As ISet
    If Not fieldTags Is Nothing Then
        Set newTags = fieldTags.Clone
    End If

    ' 克隆备注信息
    Dim newMemos As ISet
    If Not fieldTags Is Nothing Then
        Set newMemos = fieldMemos.Clone
    End If

    ' 完成克隆对象的初始化
    result.InitForClone fieldComment, fieldColor, newTags, newMemos

    Set IDFDescriptor_clone = result
End Function

' -------------------------------
' 标签操作
' -------------------------------
' 添加标签
' @param t 标签
Public Sub IDFDescriptor_addTag(ByRef t As String)
    ' 1. 如果标签集合为空，则创建一个集合
    If fieldTags Is Nothing Then
        Set fieldTags = UtilsSet.createHashSet
    End If

    ' 2. 保存标签
    fieldTags.Add t
End Sub

' 清空所有标签
Public Sub IDFDescriptor_clearAllTag()
    ' 清空时直接删除集合对象，防止克隆时产生额外的消耗
    Set fieldTags = Nothing
End Sub

' 检查是否存在指定标签
' @param t 标签
' @return 标签是否存在
Public Function IDFDescriptor_existsTag(ByRef t As String) As Boolean
    ' 1. 如果标签集合为空，则返回 False
    If fieldTags Is Nothing Then
        IDFDescriptor_existsTag = False
        Exit Function
    End If

    IDFDescriptor_existsTag = fieldTags.Exists(t)
End Function

' 删除指定标签
' @param t 标签
Public Sub IDFDescriptor_deleteTag(ByRef t As String)
    ' 1. 如果标签集合为空，则不做任何处理
    If fieldTags Is Nothing Then
        Exit Function
    End If

    fieldTags.Remove t
End Sub

' -------------------------------
' 备注对象操作
' -------------------------------
' 添加备注对象
' @param m 备注对象
Public Sub IDFDescriptor_addMemo(ByRef m As Object)
    ' 1. 如果标签集合为空，则创建一个集合
    If fieldMemos Is Nothing Then
        Set fieldMemos = UtilsSet.createHashSet
    End If

    ' 2. 保存标签
    fieldMemos.Add m
End Sub

' 清空所有备注对象
Public Sub IDFDescriptor_clearAllMemo()
    ' 清空时直接删除集合对象，防止克隆时产生额外的消耗
    Set fieldMemos = Nothing
End Sub

' 检查是否存在指定备注对象
' @param m 备注对象
' @return 标签是否存在
Public Function IDFDescriptor_existsMemo(ByRef m As Object) As Boolean
    ' 1. 如果标签集合为空，则返回 False
    If fieldMemos Is Nothing Then
        IDFDescriptor_existsMemo = False
        Exit Function
    End If

    IDFDescriptor_existsMemo = fieldMemos.Exists(m)
End Function

' 删除指定备注对象
' @param m 备注对象
Public Sub IDFDescriptor_deleteMemo(ByRef m As Object)
    ' 1. 如果标签集合为空，则不做任何处理
    If fieldMemos Is Nothing Then
        Exit Function
    End If

    fieldMemos.Remove m
End Sub